<?php
declare (strict_types = 1);

namespace app\admin\model;
use think\facade\Db;
use think\facade\Cache;
class RoleModel extends Base
{
    protected $name="role";
	/**
	 * 获取角色权限树状 角色权限选择使用
	 */
	public static function getRoleAccessTree(int $role_id){
		if(cache('RoleAccessTree'.$role_id)){
			return cache('RoleAccessTree'.$role_id);
		}
		return self::setRoleAccessTree($role_id);
	}
	/**
	 * 设置角色权限树状
	 */
	public static function setRoleAccessTree(int $role_id){
		$Access=AccessModel::getAccess();
		$RoleAccess=self::getRoleAccess($role_id)->toArray();
		$RoleAccessTree=roleAccessTree($Access,array_column($RoleAccess,'id'));
		cache('RoleAccessTree'.$role_id,$RoleAccessTree);
		return $RoleAccessTree;
	}
	/**
	 * 获取角色已有权限路由数组
	 */
	public static function getRoleRoute(int $role_id){
		if(cache('RoleRoute'.$role_id)){
			return cache('RoleRoute'.$role_id);
		}
		return self::setRoleRoute($role_id);
	}
	/**
	 * 设置角色已有路由权限数组
	 */
	public static function setRoleRoute(int $role_id){
		if(cache('RoleRoute'.$role_id)){
			$routes=cache('RoleRoute'.$role_id);
		}else{
			$roleaccess=self::getRoleAccess($role_id);
			if(!empty($roleaccess)){
				$roleaccess=$roleaccess->toArray();
			}
			$routes=array_filter(array_column($roleaccess,'route'));
			foreach ($routes as $key => &$value) {
				$value=strtolower($value);
			}
			cache('RoleRoute'.$role_id,$routes);
		}
		return $routes;
	}
	/**
	 * 获取角色已有权限
	 */
	public static function getRoleAccess(int $role_id){
		if(cache('RoleAccess'.$role_id)){
			return cache('RoleAccess'.$role_id);
		}
		return self::setRoleAccess($role_id);
	}
	/**
	 * 设置角色已有权限
	 */
	public static function setRoleAccess(int $role_id){
		try {
			$RoleAccess=Db::name('role_access')
					->alias('r')
					->join('access a','a.id=r.access_id')
					->where(['r.role_id'=>$role_id])
					->select();
			cache('RoleAccess'.$role_id,$RoleAccess);
			cache('RoleRoute'.$role_id,'');
		    return $RoleAccess;
		} catch (\Exception $e) {
			return false;
		}
	}
	
	/**
	 * 获取角色菜单
	 */
	public static function getRoleMenu(int $role_id){
		if(cache('RoleMenu'.$role_id)){
			return cache('RoleMenu'.$role_id);
		}
		return self::setRoleMenu($role_id);
	}
	/**
	 * 设置角色菜单
	 */
	public static function setRoleMenu(int $role_id){
		$RoleAccessTree=self::getRoleAccess($role_id);
		$RoleMenuTree=roleMenuTree($RoleAccessTree);
		cache('RoleMenuTree'.$role_id,$RoleMenuTree);
		return $RoleMenuTree;
	}
	/**
	 * 更新缓存数据
	 */
	public static function setAll(int $role_id){
		try {
			self::setRoleAccess($role_id);
		 	self::setRoleAccessTree($role_id);
		 	self::setRoleMenu($role_id);
		 	return true;
		} catch (\Exception $e) {
			return false;
		}
	}

	/**
     * 设置插入后动作
     */
    public static function onAfterInsert(){
        //清除缓存
        Cache::clear();
    }

    /**
     * 设置更新后动作
     */
    public static function onAfterUpdate(){
        Cache::clear();
    }
    /**
     * 设置删除后动作
     */
    public static function onAfterDel(){
        Cache::clear();
    }
	
}
